package logic

import (
	"bookmark-web/dao"
	"bookmark-web/models"
	"bookmark-web/utils"
	"errors"
	"fmt"

	"gorm.io/gorm"
)

// RegisterUser 用户注册业务逻辑
func RegisterUser(req *models.UserRegisterRequest) (*models.UserResponse, error) {
	// 1. 检查用户名和邮箱是否已存在
	err := dao.CheckUserExists(req.Username, req.Email)
	if err != nil {
		return nil, err
	}

	// 2. 对密码进行加密
	hashedPassword, err := utils.HashPassword(req.Password)
	if err != nil {
		return nil, errors.New("密码加密失败")
	}

	// 3. 创建用户对象
	user := &models.User{
		Username: req.Username,
		Password: hashedPassword,
		Email:    req.Email,
	}

	// 4. 保存到数据库
	err = dao.CreateUser(user)
	if err != nil {
		return nil, errors.New("创建用户失败")
	}

	// 5. 返回用户信息（不包含密码）
	return user.ToResponse(), nil
}

// LoginUser 用户登录业务逻辑
func LoginUser(req *models.UserLoginRequest) (*models.UserResponse, error) {
	// 1. 根据用户名查找用户
	user, err := dao.GetUserByUsername(req.Username)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户名或密码错误")
		}
		return nil, errors.New("查询用户失败")
	}

	// 2. 验证密码
	if !utils.CheckPassword(req.Password, user.Password) {
		return nil, errors.New("用户名或密码错误")
	}

	// 3. 返回用户信息（不包含密码）
	return user.ToResponse(), nil
}

// GetUserInfo 获取用户信息
func GetUserInfo(userID string) (*models.UserResponse, error) {
	user, err := dao.GetUserByID(userID)
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户不存在")
		}
		return nil, errors.New("查询用户失败")
	}
	// 返回用户信息（不包含密码）
	return user.ToResponse(), nil
}

// GetAllUsers 获取所有用户
func GetAllUsers() ([]models.User, error) {
	return dao.GetAllUsers()
}

// UpdateUserById 修改用户信息（支持部分更新）
func UpdateUserById(userID uint, req *models.UserUpdateRequest) (*models.UserResponse, error) {
	// 1. 获取原用户信息
	user, err := dao.GetUserByID(fmt.Sprintf("%d", userID))
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户不存在")
		}
		return nil, errors.New("查询用户失败")
	}

	// 2. 检查用户名和邮箱的唯一性
	if req.Username != nil && *req.Username != user.Username {
		err := dao.CheckUserExists(*req.Username, "")
		if err != nil {
			return nil, err
		}
	}

	if req.Email != nil && *req.Email != user.Email {
		err := dao.CheckUserExists("", *req.Email)
		if err != nil {
			return nil, err
		}
	}

	// 3. 更新字段
	if req.Username != nil {
		user.Username = *req.Username
	}
	if req.Email != nil {
		user.Email = *req.Email
	}
	if req.Password != nil {
		hashedPassword, err := utils.HashPassword(*req.Password)
		if err != nil {
			return nil, errors.New("密码加密失败")
		}
		user.Password = hashedPassword
	}

	// 4. 保存更新
	err = dao.UpdateUserById(fmt.Sprintf("%d", userID), *user)
	if err != nil {
		return nil, errors.New("更新用户信息失败")
	}

	// 5. 返回更新后的用户信息
	return user.ToResponse(), nil
}
